package mn.slide.laborberlin.db;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import mn.slide.laborberlin.main.ReadDataFinish;
import mn.slide.laborberlin.model.Eintrag;
import mn.slide.laborberlin.model.EntragData;
import mn.slide.laborberlin.model.Kapitel;
import mn.slide.laborberlin.model.PListInnerModel;
import mn.slide.laborberlin.model.PListMainModel;
import mn.slide.laborberlin.model.SubUeberSchrift;
import mn.slide.laborberlin.model.UeberSchrift;
import mn.slide.laborberlin.model.UnterSuchung;
import mn.slide.laborberlin.parse.ParsePlistLevelUp;

import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;

public class DataLayer {
	private List<Kapitel> kapitels;
	private HashMap<Integer, List<EntragData>> unterSuchungsAll;
	private List<UnterSuchung> merkList;
	private List<UnterSuchung> verlList;
	private List<EntragData> ueberList;
	private List<Eintrag> eintrags;
	public static DataLayer layer;
	private UnterSuchung unter;
	private ArrayList<PListMainModel> contactList;
	private String[] mStrings = {};
	public boolean refresh = false;
	int counter = 0;
	public int detialHome = 0;
	public int detialMerk = 0;
	public int detialVerl = 0;
	public int kapitelName = 0;
	Activity context;

	public DataLayer(Activity context) {
		this.context = context;
		layer = this;
		ueberList = new ArrayList<EntragData>();
		eintrags = new ArrayList<Eintrag>();
	}

	public void magreData() {

	}

	public void setContactList(ArrayList<PListMainModel> contactList) {
		this.contactList = contactList;
	}

	public ArrayList<PListMainModel> getContactList() {
		return this.contactList;
	}

	public void setKapitelList(List<Kapitel> kapitelList) {
		this.kapitels = kapitelList;
	}

	public List<UnterSuchung> getMerklist() {
		merkList = DatabaseManager.getInstance().getFaveriteList();
		return merkList;
	}

	public List<UnterSuchung> getVerllist() {
		verlList = DatabaseManager.getInstance().getHistoryList();
		return verlList;
	}

	public void addMerkList(UnterSuchung unter) {
		if (merkList != null) {
			for (UnterSuchung data : merkList) {
				if (data.getId() == unter.getId()) {
					merkList.remove(data);
					break;
				}

			}
			merkList.add(0, unter);

		}
	}

	public void addVerlList(UnterSuchung unter) {
		if (verlList != null) {
			for (UnterSuchung data : verlList) {
				if (data.getId() == unter.getId()) {
					verlList.remove(data);
					break;
				}

			}

			verlList.add(0, unter);
		}
	}

	public ArrayList<PListInnerModel> getContactDet(String inputStr) {
		Log.v("Contact String ", inputStr + " " + contactList.size());
		for (PListMainModel main : contactList) {
			if (main.getValue().equalsIgnoreCase(inputStr))
				return main.getChild();
			for (PListInnerModel inner : main.getChild()) {
				if (inner.getValue().equalsIgnoreCase(inputStr)) {
					ArrayList<PListInnerModel> iModel = new ArrayList<PListInnerModel>();
					iModel.add(inner);
					return iModel;
				}
			}
		}
		return null;
	}

	public List<EntragData> getUnterSuchung(int position) {
		if (position != -1)
			return this.unterSuchungsAll.get(position);
		else {
			return ueberList;
		}
	}

	public UnterSuchung getUnter() {
		return this.unter;
	}

	public void setUnter(UnterSuchung unter) {
		this.unter = unter;
	}

	// public List<UnterSuchung> searchData(String searchText) {
	// List<UnterSuchung> result = new ArrayList<UnterSuchung>();
	// for (EntragData unter : unterSuchungsAll.get(12)) {
	// if (unter.getKuerzel().indexOf(searchText) != -1
	// || unter.getName().indexOf(searchText) != -1) {
	// result.add(unter);
	// }
	// }
	// return result;
	// }

	public void setUnterSuchungsAll(
			HashMap<Integer, List<EntragData>> unterSuchungsAll) {
		this.unterSuchungsAll = unterSuchungsAll;
	}

	public void readDatabase(ReadDataFinish data) {
		unterSuchungsAll = new HashMap<Integer, List<EntragData>>();
		new ReadData(data).execute();
	}

	private class ReadData extends AsyncTask<Void, Void, String[]> {
		ReadDataFinish data;

		public ReadData(ReadDataFinish data) {
			this.data = data;
		}

		@Override
		protected String[] doInBackground(Void... params) {
			int i = 0;
			ParsePlistLevelUp parse = new ParsePlistLevelUp(context);
			try {
				contactList = parse.getEventsFromAnXML();
			} catch (XmlPullParserException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			ueberList.addAll(DatabaseManager.getInstance()
					.getAllSubUeberSchrift());
			for (Kapitel kapitel : kapitels) {
				new ReadKapitel(kapitel, i, data).execute();
				i++;
			}
			return mStrings;
		}

		@Override
		protected void onPostExecute(String[] result) {
			super.onPostExecute(result);
			Log.v("ReadData", "FINISH");
		}
	}

	private class ReadKapitel extends AsyncTask<Void, Void, String[]> {

		Kapitel kapitel;
		List<EntragData> unterSuchungs;
		ReadDataFinish data;
		int i;

		public ReadKapitel(Kapitel kapitel, int i, ReadDataFinish data) {
			super();
			this.kapitel = kapitel;
			this.i = i;
			this.data = data;
		}

		@Override
		protected String[] doInBackground(Void... params) {
			unterSuchungs = new ArrayList<EntragData>();
			for (Eintrag item : kapitel.getEintragSet()) {
				eintrags.add(item);
				if (item.getUeberItem() != null) {
					if (item.getUeberItem().getSubUeberSchriftSet().size() > 0) {
						for (SubUeberSchrift sub : item.getUeberItem()
								.getSubUeberSchriftSet()) {
							ueberList.add(sub);
						}
					}
					unterSuchungs.add(item.getUeberItem());
					ueberList.add(item.getUeberItem());
				} else {

					unterSuchungs.add(item.getUnterItem());
					ueberList.add(item.getUnterItem());
				}
			}
			Log.v("Reading data", kapitel.getValue());
			unterSuchungsAll.put(i, unterSuchungs);
			return mStrings;
		}

		@Override
		protected void onPostExecute(String[] result) {
			super.onPostExecute(result);
			counter++;
			if (counter == kapitels.size()) {
				data.finishReadData();
			}
		}
	}

	public List<Kapitel> getKapitelList() {
		return this.kapitels;
	}

	public Kapitel getKapitelWithId(int id) {
		for (Kapitel kapi : kapitels) {
			if (kapi.getId() == id) {
				return kapi;
			}
		}
		return null;
	}

	public Eintrag getEintragWithId(int id) {
		for (Eintrag kapi : eintrags) {
			if (kapi.getId() == id) {
				return kapi;
			}
		}
		return null;
	}

	public UeberSchrift getUeberSchriftWithId(int id) {
		for (EntragData data : ueberList) {
			if (data instanceof UeberSchrift) {
				if (((UeberSchrift) data).getId() == id)
					return (UeberSchrift) data;
			}
		}
		return null;
	}

	public SubUeberSchrift getSubUeberSchriftWithId(int id) {
		for (EntragData data : ueberList) {
			if (data instanceof SubUeberSchrift) {
				if (((SubUeberSchrift) data).getId() == id)
					return (SubUeberSchrift) data;
			}
		}
		return null;
	}

	public List<EntragData> getSearchResult(String k) {
		List<EntragData> result = new ArrayList<EntragData>();
		for (EntragData data : ueberList) {
			if (data instanceof UnterSuchung) {
				if (data.getName().indexOf(k) != 1
						|| ((UnterSuchung) data).getKuerzel().indexOf(k) != -1) {
					result.add(data);
				}
			} else {
				if (data.getName().indexOf(k) != -1)
					result.add(data);
			}
		}
		return result;
	}

}
